/**
 * @file    inf_fan.h
 * @author  yhy
 * @brief   风扇系统头文件
 * @version 1.00
 * @date    2025-08-05
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef __INF_FAN_H__
#define __INF_FAN_H__

#include "common_config.h"

#include <stdbool.h>
#include <stdint.h>

/**
 * @brief 风扇索引枚举
 *
 */
typedef enum
{
    FAN_IDX_FANL = 0U,
    FAN_IDX_FANR = 1U,
    FAN_IDX_MAX,
} fan_idx_e;

/**
 * @brief 风扇档位枚举, 低驱
 *
 */
typedef enum
{
    FAN_GEAR_HIGH  = 0U,   /*!< 高档位 0%占空比 */
    FAN_GEAR_MID   = 33U,  /*!< 中档位 33%占空比 */
    FAN_GEAR_LOW   = 66U,  /*!< 低档位 66%占空比 */
    FAN_GEAR_CLOSE = 100U, /*!< 关闭档位 100%占空比 */
    FAN_GEAR_MAX,
} fan_gear_e;

/**
 * @brief 风扇故障枚举
 *
 */
typedef enum
{
    FAN_FAULT_NONE        = 0U, /*!< 无故障 */
    FAN_FAULT_OPEN_LOAD   = 1U, /*!< 过载故障 */
    FAN_FAULT_SHORT       = 2U, /*!< 短路故障 */
    FAN_FAULT_OVERCURRENT = 3U, /*!< 过载电流故障 */
    FAN_FAULT_BLOCKED     = 4U, /*!< 阻塞故障 */
    FAN_FAULT_MAX,
} fan_fault_e;

/**
 * @brief 风扇PWM配置结构体
 *
 */
typedef struct
{
    uint32_t instance; /*!< PWM实例 */
    uint32_t pwm_ch;   /*!< PWM通道 */
} fan_pwm_config_t;

/**
 * @brief 风扇结构体
 *
 */
typedef struct
{
    fan_pwm_config_t pwm_config; /*!< PWM配置 */
    fan_gear_e       gear;       /*!< 风扇档位 */
    fan_gear_e       last_gear;  /*!< 风扇上一次档位 */
    fan_fault_e      fault;      /*!< 风扇故障 */
    bool             blocked;    /*!< 风扇是否阻塞, 用于和加热互锁 */
} fan_t;

/**
 * @brief 风扇系统结构体
 *
 */
typedef struct
{
    fan_t fans[FAN_IDX_MAX]; /*!< 风扇指针数组 */
    bool  system_enable;     /*!< 风扇系统是否使能 */
} fan_system_t;

result_e    inf_fan_init(void);
void        inf_fan_set_system_enable(bool enable);
result_e    inf_fan_set_gear(fan_idx_e idx, fan_gear_e gear);
result_e    inf_fan_set_fault(fan_idx_e idx, fan_fault_e fault);
result_e    inf_fan_check_interlock(fan_idx_e idx, bool blocked);
fan_gear_e  inf_fan_get_gear(fan_idx_e idx);
fan_fault_e inf_fan_get_fault(fan_idx_e idx);
bool        inf_fan_get_bolcked_status(fan_idx_e idx);
void        inf_fan_handle(void);

#endif
